from eval_lib.common.ssh import SSHPool
from common.module import AgentMeta
from config import conf


class Base(object):

    def __init__(self) -> None:
        self._ssh_pool = SSHPool()

    def get_ssh_pool(self):
        return self._ssh_pool

    def init(self, agent_name: str, meta: AgentMeta):
        """初始化采集器参数的函数
        :param meta: 采集器参数的元数据
        :param agent_name: 采集器名称，唯一标识
        :return: 
        """
        self._ssh_pool.default_port = meta.ssh_port
        self._ssh_pool.default_username = meta.ssh_username
        self._ssh_pool.default_password = meta.ssh_password
        self.agent_ip = meta.agent_ip
        self.agent_version = meta.version
        self.agent_name = agent_name
        self.deploy_type = None
        # 配置文件中，agent_tools包含的参数
        agent_type = conf.case_params.agent_type
        self.custom_param: dict = conf.agent_tools[agent_type]


class AgentBase(Base):
    """所有采集器类的基类"""

    def __init__(self) -> None:
        super().__init__()

    # ----------------以下属性待继承类副职----------------

    # 1.采集器进程名，用于telegraf获取进程负载数据
    AGENT_PROCESS_NAME = ""

    # ----------------以下方法待继承类实现----------------
    # 发生预期外失败时，直接assert退出

    # 1. 部署采集器， 包含功能为拉镜像、下载包以及部署等
    def deploy(self):
        """部署采集器
        :return: 
        """
        pass

    # 2. 启动采集器， 包含功能为启动进程、镜像
    def start(self):
        """启动采集器
        :return: 
        """
        pass

    # 3. 停止采集器，包含功能停止进程、镜像
    def stop(self):
        """停止采集器，保留功能，当前直接使用uninstall
        :return: 
        """
        pass

    # 4. 卸载采集器，包含功能为删除服务、镜像
    def uninstall(self):
        """卸载采集器
        :return: 
        """
        pass

    # 5. 重启采集器，包含功能为停止进程、镜像、启动进程、镜像
    def restart(self):
        """重启采集器
        :return: 
        """
        pass

    # 6. 清理采集器及其产生的资源
    def clear(self):
        """清理采集器及其产生的资源
        :return: 
        """
        pass

    # 7. 检查采集器状态，发生无法使用的异常时直接assert
    def ensure_agent_status_available(self):
        """检查采集器状态保证其正常运行
        :return: 
        """
        pass

    # 8. 检查采集器在特定时间是否发生异常重启
    def check_abnormal_restart_time(self, start_time, end_time) -> bool:
        """检查采集器在特定时间是否发生异常重启
        :return: bool
        """
        pass

    # 9. 配置采集器
    def configure_agent(self, config_dict: dict):
        """配置采集器，将需要的配置写入，配置文件内容在self.custom_param中, config_dict当前未启用
        :param config_dict: 配置参数
        :return: 
        """
        pass

    # 10. 获取特定时间采集器数据， 保留函数，未使用
    def get_metric_data_by_agent(self, start_time, end_time) -> dict:
        """获取特定时间采集器采集到的数据，例如bps，pps，丢包等等， 保留函数，未使用
        :param start_time: 结束时间
        :param end_time: 开始时间
        :return: 字典形式的数据
        """
        pass
